/**
 * @file bibserver.h
 * @brief Header file per bibserver
 * @author Marco Luisi
 * Si dichiara che il contenuto di questo file e' in ogni sua parte opera originale dell' autore.
 */

#ifndef BIBSERVER_H_
#define BIBSERVER_H_

#define TMPDIR "tmp"
#define SOCKPATH "./tmp/"
#define LIST_INIT 5

/** @name Messaggi di errore nell'avvio del server
 *  Messaggi di errore su stderr
 */
/**@{*/
#define ERR_PARAM "Errore, fornire due parametri di avvio per il server: \"nome biblioteca\" e \"file dei records\".\n"
#define ERR_INIT "Errore in fase di inizializzazione, server in chiusura!\n"
#define ERR_FILE "Errore nell'apertura del file / directory"
#define ERR_RECORD "Errore nell'apertura dei record!"
#define ERR_SOCK "Errore in fase di apertura/connessione su socket"
#define ERR_ACPT "Errore nell'accettazione di una nuoca connessione"
#define ERR_CLS "Errore in fase di chiusura del server channel"
#define ERR_STR "Nessun record salvato!"
#define ERR_SAV "Errore nel salvataggio dei record; scritti su disco %d records\n"
#define ERR_THR "Errore nella creazione di un nuovo thread worker. Server in uscita!"
#define ERR_FCL "Errore nella chiusura del file di log"
/**@}*/

/**
 * @brief Funzione di inizializzazione del server.
 *
 * Inizializzazione del server: apre i file e il socket, carica le schede bibliografiche.
 * Restituisce codice di errore in caso di problemi.
 *
 * @param bib_name nome della biblioteca
 * @param record_filename nome del file con i record da caricare
 * @return esito della inizializzazione.
 * @retval ERROR
 * @retval OK
 */
int init(char *bib_name, char *record_filename);

/**
 * @brief Funzione che realizza il ciclo di funzionamento del server;
 * accettazione nuove connessioni dai client
 * creazione thread per servire le richieste
 * @return esito funzione
 * @retval OK
 * @retval ERROR
 */
int serve(void);

/**
 * @brief Funzione di salvataggio dei record
 *
 * Prima della effettiva scrittura su disco dei record, rinomina il file già esistente,
 * in modo da avere una copia di sicurezza in caso di errore in fase di scrittura del nuovo file.
 *
 * @param logfile file di log
 * @return res esito del salvataggio
 * @retval OK
 * @retval ERROR
 */
int save(char* bib_name);

/**
 * @brief Gestione dei segnali del server
 * @return esito della funzione
 */
int signal_handling(void);

/**
 * @brief Gestore del segnale SIGINT
 * @param signum
 *
 * Setta la variabile pending_signal ad 1.
 *
 */
static void sigint_handler(int signum);

/**
 * @brief Gestore del segnale SIGTERM
 * @param signum
 *
 * Setta la variabile pending_signal ad 1.
 *
 */
static void sigterm_handler(int signum);

#endif /* BIBSERVER_H_ */
